package online.longzipeng.mywebdemo.enums;

import online.longzipeng.mywebdemo.pojo.vo.OptionVo;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author: lzp
 * @description: 通用枚举
 * @Date: 2022/9/24
 */
public interface BaseEnum<P> {

	/**
	 * 获取标题
	 */
	String getTitle();

	/**
	 * 获取值
	 */
	P getValue();

	/**
	 * 将枚举类型转换为选项集合
	 *
	 * @param enumClass
	 * @return
	 */
	static List<OptionVo<Integer>> getOptions(Class<? extends BaseEnum> enumClass) {
		BaseEnum[] enumConstants = enumClass.getEnumConstants();
		if (enumConstants != null && enumConstants.length > 0) {
			return Arrays.stream(enumConstants).map(enumC ->
					OptionVo.<Integer>builder()
							.label(enumC.getTitle())
							.value((Integer) enumC.getValue())
							.build()
			).collect(Collectors.toList());
		}
		return null;
	}

//	/**
//	 * 通过value获取枚举对象
//	 * 已弃用，改用下方的泛型进行优化
//	 * @param enumClass
//	 * @param value
//	 * @return
//	 */
//	static BaseEnum valueOf(Class<? extends BaseEnum> enumClass, Integer value) {
//		if (value == null) {
//			return null;
//		}
//		BaseEnum[] enumConstants = enumClass.getEnumConstants();
//		if (enumConstants != null && enumConstants.length > 0) {
//			for (BaseEnum enumConstant : enumConstants) {
//				if (value.equals(enumConstant.getValue())) {
//					return enumConstant;
//				}
//			}
//		}
//		return null;
//	}

	/**
	 * 通过value获取枚举对象
	 * 2022-12-09日使用泛型优化此方法
	 *
	 * @param enumClass 枚举的类对象
	 * @param value     值
	 * @return
	 */
	static <T extends BaseEnum> T valueOf(Class<T> enumClass, Object value) {
		if (value == null) {
			return null;
		}
		T[] enumConstants = enumClass.getEnumConstants();
		if (enumConstants == null) {
			return null;
		}
		for (T enumConstant : enumConstants) {
			if (value.equals(enumConstant.getValue())) {
				return enumConstant;
			}
		}
		return null;
	}


}
